import { message } from 'ant-design-vue'
import axios from 'axios'
import Router from '../router/index'

// 序列化请求参数
 /* eslint-disable */
const paramSerialize = (params = {}) => {
  if (typeof params !== null && typeof params === 'object') {
      let str = ''
      Object.keys(params).map((key) => {
          // eslint-disable-next-line
          if (params[key] || params[key] == 0) {
              if (str) {
                  str += `&${key}=${params[key]}`
              } else {
                  str += `?${key}=${params[key]}`
              }
          }
      })
      return str
  }
}

let pending = [] // 声明一个数组用于存储每个ajax请求的取消函数和ajax标识

// 删除已经响应过的请求
const removePending = (url, data) => {
  for (let index in pending) {
    if (pending[index].url === `${url}${data}`) {
      pending.splice(index, 1)
    }
  }
}

// 默认不拦截的请求
const request = [
  'province/index',
  'city/index',
  'district/index'
]

axios.defaults.baseURL = `${process.env.VUE_APP_URL}`
// 添加请求拦截器
axios.interceptors.request.use((config) => {
  // 默认拦截所有请求标识
  let requestFlag = true
  // 如果包含直接跳过，不做拦截
  request.forEach(item => {
    if (config.url.includes(item)) {
      requestFlag = false
    }
  })
  if (requestFlag) {
    let flag = pending.find(item => item.url === `${config.baseURL}${config.url}${paramSerialize(config.data)}`)
    if (flag) {
      // eslint-disable-next-line
      return Promise.reject({ message: 'cancel' })
    }
    pending.push({ url: `${config.baseURL}${config.url}${paramSerialize(config.data)}` })
  }
  config.headers.common['Authorization'] = localStorage.getItem('token')
  config.headers.common['Content-Type'] = 'application/json'
  return config
}, (error) => {
  return Promise.reject(error)
})
// 添加响应拦截器
axios.interceptors.response.use((res) => {
  console.log(res)
  // 对响应数据做点什么
  try {
    removePending(res.config.url, paramSerialize(JSON.parse(res.config.data || '{}'))) // 在一个ajax响应后再执行一下取消操作，把已经完成的请求从pending中移除
  } catch (e) {
    removePending(res.config.url, paramSerialize(res.config.data || '{}')) // 在一个ajax响应后再执行一下取消操作，把已经完成的请求从pending中移除
  }
  if (res.status === 200) {
    if (res.data.error) {
      if (res.data.error_desc === '登录过期') {
        localStorage.removeItem('token')
      }
      if (res.data.error_desc === '未登录') {
        Router.push({
          path: '/login'
        })
      }
      message.warning(res.data.error_desc)
      return Promise.reject(new Error(res.data.error_desc))
    } else {
      return Promise.resolve(res.data)
    }
  } else {
    message.warning('网络错误,请稍后重试')
    return Promise.reject(new Error('网络错误,请稍后重试'))
  }
}, (error) => {
  // 如果不是自动取消请求的，则删除最后一位请求，这样主要是为了防止，后台接口响应失败，但是pending里面已经存在当前请求，导致后续再次去请求，就直接被拦截了
  if (error.message !== 'cancel') {
    pending.pop()
  }
  if (error.message && error.message !== 'cancel') {
    message.warning(error.message)
  }
  // 对响应错误做点什么
  return Promise.reject(error)
})
export default axios
